package controllers;

import play.*;
import play.mvc.*;

import java.util.ArrayList;
import java.util.Date;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;

import models.Agent;
import models.CISService;
import models.Candidat;
import models.EtatCandid;
import models.Grade;
import models.MotifAnnulation;
import models.Role;
import models.Stage;
import models.Statut;
import models.StructureCoord;
import models.SystemSDIS;

@With(Secure.class)
public class Candidats extends CRUD { 

	@Before
	static void setConnectedUser() {
		if(Security.isConnected()) {
			Agent agent = Agent.find("byEmail", Security.connected()).first();
			renderArgs.put("agent_email", agent.email);
			renderArgs.put("agent_fullname", agent.fullname());
			renderArgs.put("agent_responsable", agent.getCisService().isResponsable(agent));
			renderArgs.put("agent_orga", !agent.isOrgaStage(agent));
			renderArgs.put("resp", (agent.isOrgaStage(agent) || SystemSDIS.getSystemSDIS().isResponsableDepartemental(agent)));
			if(agent.niv.id != 0){
				renderArgs.put("agent_for", agent.niv);
			}
			renderArgs.put("agent_respPedago", SystemSDIS.getSystemSDIS().isResponsableDepartemental(agent));
		}
	}

	//Candidatures de l'utilisateur connecté
	public static void candidatures(){
		Agent agent = Agent.find("byEmail", Security.connected()).first();
		List<Candidat> candidatures = agent.getCandidatures();
		render(candidatures);	
	} 

	public static void demandeAnnulation(Long id){
		List<MotifAnnulation> motifs = MotifAnnulation.all().fetch();
		Stage stage = Stage.findById(id);
		Candidat candidature = Candidat.find("stage like ? ", stage).first();
		render(motifs, candidature);
	} 

	public static void demandeAnnulationSave(Long candidature_id, Long motif_id ){
		Candidat c = Candidat.findById(candidature_id);
		c.setMotifAnnulation((MotifAnnulation) MotifAnnulation.findById(motif_id));
		c.demandeAnnulation=true;
		c.save();
		flash.success("Votre demande d'annulation pour le stage "+c.stage+" a bien été prise en compte.");
		Candidats.candidatures();
	}

	public static void listDemandeAnnulation(){
		Agent agent = Agent.find("byEmail", Security.connected()).first();
		EtatCandid etat_annule=EtatCandid.find("numEtat = 7").first();
		if(SystemSDIS.getSystemSDIS().isResponsableDepartemental(agent)){
			List<Candidat> candidatures = Candidat.find("demandeAnnulation=true and etatCandid != ? and candidature_non_annuler = 0", etat_annule).fetch();
			render(candidatures);
		}

		else if(!agent.isOrgaStage(agent)){
			List<Stage> stages = Stage.find("organisateur = ? or gestionnaireAdmin = ?", agent, agent).fetch();
			List<Candidat> candidatures=new ArrayList<Candidat>();
			Iterator<Stage> it=stages.iterator();
			while(it.hasNext()){
				candidatures.addAll(it.next().candidatures);
			}
			Iterator<Candidat> ite=candidatures.iterator();
			while(ite.hasNext()){
				Candidat cand=ite.next();
				if(cand.demandeAnnulation==false || cand.etatCandid==etat_annule || cand.candidature_non_annuler==true){
					candidatures.remove(cand);
				}
			}
			render(candidatures);
		}
		else{
			render("@candidatures");
		}
	}

	public static void validationAnnulation(){
		String id = params.get("id");
		EtatCandid etat_annule=EtatCandid.find("numEtat = 7").first();
		List<Candidat> candidatures = Candidat.find("motifAnnulation != null and etatCandid != ? ", etat_annule).fetch();
		Iterator<Candidat> i = candidatures.iterator();
		Candidat candidat;
		//parcours des candidatures de la structure d'id passe en param
		while(i.hasNext()){
			candidat = (Candidat) i.next();
			if(params.get("validation_"+candidat.id).equals("oui")){
				candidat.setEtatCandid(etat_annule);
				candidat.candidature_non_annuler = false;
				candidat.save();
			}
			else if(params.get("validation_"+candidat.id).equals("non")){
				candidat.candidature_non_annuler = true;
				candidat.save();
			}
		}
		Candidats.listDemandeAnnulation();
	}

	public static void validationCandidatures(){

		Agent agent = Agent.find("byEmail", Security.connected()).first();
		List<Candidat> listeARender=new ArrayList<Candidat>();
		List<Stage> stages;
		//recuperation des stages correspondant a la structure passé en paramètres
		if(SystemSDIS.getSystemSDIS().isResponsableDepartemental(agent)){
			stages=Stage.findAll();
		}
		else{stages=Stage.find("organisateur = ? or gestionnaireAdmin = ?", agent, agent).fetch();}
		Iterator<Stage> itStages=stages.iterator();
		Stage stage;
		List<Candidat> listCandid;
		Iterator<Candidat> itCandid;
		Candidat candidat;

		//parcours des stages de la structure d'id passe en param
		while(itStages.hasNext()){
			stage=itStages.next();

			listCandid=stage.getCandidatures();

			itCandid=listCandid.iterator();
			//parcours des candidat d'un stage.
			while(itCandid.hasNext()){
				candidat=itCandid.next();
				//si la candid est en attente d'authorisation, ajout dans la liste des candidatures
				//a afficher
				if(candidat.getEtatCandid().getNumEtat()==3){
					listeARender.add(candidat);
				}
			}

		}
		render(listeARender);
	}

	public static void envoieValidation(){
		Iterator itStages= Stage.findAll().iterator();
		Stage stage;
		List<Candidat> listCandid;
		Iterator<Candidat> itCandid;
		Candidat candidat;
		EtatCandid etatOK=EtatCandid.find("numEtat = 5").first();
		EtatCandid etatNON=EtatCandid.find("numEtat = 4").first();
		EtatCandid etatATTENTE=EtatCandid.find("numEtat = 6").first();

		while(itStages.hasNext()){
			stage=(Stage) itStages.next();
			listCandid=stage.getCandidatures();
			itCandid=listCandid.iterator();
			//parcours des candidat d'un stage.
			while(itCandid.hasNext()){
				candidat=itCandid.next();

				if(candidat.getEtatCandid().numEtat==3){
					//recuperation pour chaque candid des contenut des checkbox
					if(candidat.getEtatCandid().getNumEtat()==3){
						//si la case oui a été coché pour ce candidat
						//passage de la candid en etat "attente validation"
						if(params.get("O"+candidat.getAgent().id)!=null){
							candidat.setEtatCandid(etatOK);
							candidat.save();
						}
						//sinon si la case Non a été coché, passage en état "non autorisé"
						else if(params.get("N"+candidat.getAgent().id)!=null){
							candidat.setEtatCandid(etatNON);
							candidat.setMotifRefus(params.get("R"+candidat.getAgent().id));
							candidat.save();
						}
						//sinon si la case Liste Attente a été coché, passage en état "mise en liste d'attente"
						else if(params.get("L"+candidat.getAgent().id)!=null){
							candidat.setEtatCandid(etatATTENTE);
							candidat.save();
						}
					}
				}
			}

		}
		validationCandidatures();
	}

	public static void gestionCandidatures(){
		Agent agent = Agent.find("byEmail", Security.connected()).first();
		List<Stage> stages;
		if(SystemSDIS.getSystemSDIS().isResponsableDepartemental(agent)){
			stages=Stage.findAll();
		}
		else{stages=Stage.find("organisateur = ? or gestionnaireAdmin = ?", agent, agent).fetch();}
		render(stages);
	}

	public static void validation(Long stageId){
		Stage stage = Stage.findById(stageId);
		EtatCandid etat = EtatCandid.find("numEtat = 5").first();
		List<Candidat> candidatures = Candidat.find("stage like ? and etatCandid like ?", stage, etat).fetch();
		render(candidatures, stage);
	}

	public static void annulation(Long stageId){
		Stage stage = Stage.findById(stageId);
		EtatCandid etat = EtatCandid.find("numEtat = 7").first();
		List<Candidat> candidatures = Candidat.find("stage like ? and etatCandid like ?", stage, etat).fetch();

		render(candidatures, stage);
	}

	public static void listeAttente(Long stageId){
		Stage stage = Stage.findById(stageId);
		EtatCandid etat = EtatCandid.find("numEtat = 6").first();
		List<Candidat> candidatures = Candidat.find("stage like ? and etatCandid like ?", stage, etat).fetch();

		render(candidatures, stage);
	}

	public static void gestionCandidatureSave(Long stageId, int numEtat){
		EtatCandid etatCandidat=EtatCandid.find("numEtat = "+numEtat).first();
		EtatCandid etatValide=EtatCandid.find("numEtat = 5").first();
		EtatCandid etatListeAttente=EtatCandid.find("numEtat = 6").first();
		EtatCandid etatAnnule=EtatCandid.find("numEtat = 7").first();
		Stage stage = Stage.findById(stageId);
		List<Candidat> candidatures = Candidat.find("stage like ? and etatCandid like ? ", stage, etatCandidat).fetch();
		Iterator<Candidat> i = candidatures.iterator();
		Candidat candidat;
		//parcours des candidatures de la structure d'id passe en param
		while(i.hasNext()){
			candidat = (Candidat) i.next();
			if(params.get("validation_"+candidat.id).equals("validee")){
				candidat.setEtatCandid(etatValide);
				candidat.save();
			}
			if(params.get("validation_"+candidat.id).equals("annulee")){
				candidat.setEtatCandid(etatAnnule);
				candidat.save();
			}
			if(params.get("validation_"+candidat.id).equals("listeAttente")){
				candidat.setEtatCandid(etatListeAttente);
				candidat.save();
			}
		}
		flash.success("Modification effectuée");
		Candidats.gestionCandidatures();

	}

	public static void ajouterCandidature(Long stageId){
		List<CISService> cisServices = CISService.findAll();
		List<Role> roles = Role.findAll();
		List<Agent> agents = Agent.findAll();
		Stage stage = Stage.findById(stageId);
		render(cisServices, roles, stage, agents);
	}
	public static void ajouterCandidatureSave(Long stageId, Long agentId, boolean logement, String motivation, long role, String precisionDate){	
		Stage stage = Stage.findById(stageId);    
		Agent agent = Agent.findById(agentId);
		Candidat c = new Candidat(agent, stage, motivation, role);
		EtatCandid etat = EtatCandid.find("numEtat = 5").first();
		c.setEtatCandid(etat);
		if(role != 0)
		{
			if(!stage.contientCandidat(c)){
				c.candidater(logement, role, precisionDate);
				agent.save();
				stage.save();
				flash.success("La candidature a bien été enregistrée");
				Candidats.gestionCandidatures();
			}
			else {
				Role roles = Role.findById(role);
				flash.error("Le candidat ne peut pas candidater en tant que "+roles.toString()+" pour ce stage");
				Candidats.gestionCandidatures();
			}
		}
		else {
			flash.error("Vous devez choisir un rôle pour ce stage");
			ajouterCandidature(stageId);
		}
	}

}